package com.ingenio.dao;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.Producto;
import com.ingenio.business.UMProducto;
import com.ingenio.business.UnidadMedida;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class UMProductoAdapter extends Adapter{
	
	public void agregarUMProducto(UMProducto ump) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
	    	conn = (Connection) abrirConexion();
	    	String add ="INSERT into umproducto (IdProducto, IdUnidadMedida, IdUMConversion, coeficienteConv, descUMProducto, umpDefault, umpHabilitado) " +
					"VALUES (?, ?, ?, ?, ?, ?, 1)";
			stmt = (PreparedStatement) conn.prepareStatement(add);
			stmt.setString(1, ump.getProducto().getIdProducto());
			stmt.setInt(2, ump.getUnidadMedida().getIdUnidadMedida());
			stmt.setInt(3, ump.getUmConversion().getIdUnidadMedida());
			stmt.setDouble(4, ump.getCoeficiente());
			stmt.setString(5, ump.getDescripcion());
			stmt.setBoolean(6, ump.isUmpDefault());
			stmt.execute();
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
	public boolean agregarUMProducto(List<UMProducto> umsProd, String idProducto, Connection conn) throws Exception{
		PreparedStatement stmt = null;
		try {
	    	String add ="INSERT into umproducto (IdProducto, IdUnidadMedida, IdUMConversion, coeficienteConv, descUMProducto, umpDefault, umpHabilitado) " +
					"VALUES (?, ?, ?, ?, ?, ?, 1)";
			stmt = (PreparedStatement) conn.prepareStatement(add);
			for(UMProducto ump : umsProd){
				stmt.setString(1, idProducto);
				stmt.setInt(2, ump.getUnidadMedida().getIdUnidadMedida());
				stmt.setInt(3, (ump.getUmConversion()!=null)?ump.getUmConversion().getIdUnidadMedida():0); //null
				stmt.setDouble(4, (ump.getUmConversion()!=null)?ump.getCoeficiente():0); //null
				stmt.setString(5, ump.getDescripcion());
				stmt.setBoolean(6, ump.isUmpDefault());
				stmt.addBatch();
			}
			stmt.executeBatch();
    	}
    	catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
//	public boolean guardarUMProducto(List<UMProducto> unidades, String idProducto) throws Exception{
//		Connection conn = null;
//    	try{
//			conn = (Connection) abrirConexion();
//	    	conn.setAutoCommit(false);
//	    	
//	    	String add_um = "INSERT INTO umproducto(IdProducto,IdUnidadMedida,IdUMConversion,coeficienteConv,descUMProducto,umpDefault,umpHabilitado) " +
//	    			"VALUES (?,?,?,?,?,?,?)";
//	    	PreparedStatement stmtInsert = (PreparedStatement) conn.prepareStatement(add_um);
//	    	for(UMProducto umProd : unidades){
//	    		stmtInsert.setString(1, idProducto);
//	    		stmtInsert.setInt(2, umProd.getUnidadMedida().getIdUnidadMedida());
//	    		stmtInsert.setInt(3, (umProd.getUmConversion()!=null)?umProd.getUmConversion().getIdUnidadMedida():0); // null
//	    		stmtInsert.setDouble(4, (umProd.getUmConversion()!=null)?umProd.getCoeficiente():0); // null
//	    		stmtInsert.setString(5, umProd.getDescripcion());
//	    		stmtInsert.setBoolean(6, umProd.isUmpDefault());
//	    		stmtInsert.setBoolean(7, umProd.isUpmHabilitado());
//	    		
//	    		stmtInsert.addBatch();
//	    	}
//	    	
//	    	stmtInsert.executeBatch();
//	    	conn.commit();
//	    	
//		}catch(Exception e){
//			e.printStackTrace();
//			return false;
//		}finally{
//			cerrarConexion(conn);
//		}
//    	return true;
//	}
//	
//	public boolean guardarUMProducto(List<UMProducto> unidades, String idProducto, Connection conn) throws Exception{
//		try{
//			String add_um = "INSERT INTO umproducto(IdProducto,IdUnidadMedida,IdUMConversion,coeficienteConv,descUMProducto,umpDefault,umpHabilitado) " +
//	    			"VALUES (?,?,?,?,?,?,?)";
//	    	PreparedStatement stmtInsert = (PreparedStatement) conn.prepareStatement(add_um);
//	    	for(UMProducto umProd : unidades){
//	    		stmtInsert.setString(1, idProducto);
//	    		stmtInsert.setInt(2, umProd.getUnidadMedida().getIdUnidadMedida());
//	    		stmtInsert.setInt(3, (umProd.getUmConversion()!=null)?umProd.getUmConversion().getIdUnidadMedida():0); // null
//	    		stmtInsert.setDouble(4, (umProd.getUmConversion()!=null)?umProd.getCoeficiente():0); // null
//	    		stmtInsert.setString(5, umProd.getDescripcion());
//	    		stmtInsert.setBoolean(6, umProd.isUmpDefault());
//	    		stmtInsert.setBoolean(7, umProd.isUpmHabilitado());
//	    		stmtInsert.addBatch();
//	    	}
//	    	stmtInsert.executeBatch();
//	    }catch(Exception e){
//			e.printStackTrace();
//			return false;
//		}
//    	return true;
//	}
	
//	public void eliminarUMProducto(UMProducto ump) throws Exception{
//    	Connection conn = null;
//    	PreparedStatement stmt = null;
//    	try {
//	    	conn = (Connection) abrirConexion();
//	    	//Clave primaria IdProducto && IdUnidadMedida
//	    	String del ="UPDATE umproducto SET umpHabilitado = 0 WHERE IdProducto = ? and IdUnidadMedida = ? ";
//			stmt = (PreparedStatement) conn.prepareStatement(del);
//			stmt.setString(1, ump.getProducto().getIdProducto());
//			stmt.setInt(2, ump.getUnidadMedida().getIdUnidadMedida());
//			stmt.execute();
//		}
//    	catch (Exception e) {
//			e.printStackTrace();
//			throw new Exception("Error al conectar con la base de datos.", e);
//		}
//    	finally{
//    		//conn.close();
//    		cerrarConexion(conn);
//    	}
//    }
//	
//	public boolean eliminarUMProducto(List<UMProducto> unidades, Connection conn) throws Exception{
//    	PreparedStatement stmt = null;
//    	String del ="UPDATE umproducto SET umpHabilitado = 0 WHERE IdProducto = ? and IdUnidadMedida = ? ";
//    	try{
//    		stmt = (PreparedStatement) conn.prepareStatement(del);
//	    	for(UMProducto umProd : unidades){
//	    		stmt.setString(1, umProd.getProducto().getIdProducto());
//	    		stmt.setInt(2, umProd.getUnidadMedida().getIdUnidadMedida());
//	    		stmt.addBatch();
//	    	}
//	    	stmt.executeBatch();
//	    }catch(Exception e){
//			e.printStackTrace();
//			return false;
//		}
//    	return true;
//    }
	
//	public void modificarUMProducto(UMProducto ump) throws Exception{
//    	Connection conn = null;
//    	PreparedStatement stmt = null;
//    	try {
//	    	conn = (Connection) abrirConexion();
//	    	
//	    	String upd ="UPDATE umproducto SET descUMProducto = ?, umpDefault = ? WHERE IdProducto = ? and IdUnidadMedida = ?";
//			stmt = (PreparedStatement) conn.prepareStatement(upd);
//	    	stmt.setString(1, ump.getDescripcion());
//	    	stmt.setBoolean(2, ump.isUmpDefault());
//	    	stmt.setString(3, ump.getProducto().getIdProducto());
//	    	stmt.setInt(4, ump.getUnidadMedida().getIdUnidadMedida());
//			stmt.executeUpdate();
//		}
//    	catch (Exception e) {
//			e.printStackTrace();
//			throw new Exception("Error al conectar con la base de datos.", e);
//		}
//    	finally{
//    		//conn.close();
//    		cerrarConexion(conn);
//    	}
//    }
	
	public boolean modificarUMProducto(List<UMProducto> umsProd, Connection conn) throws Exception{
    	PreparedStatement stmt = null;
    	try {
	    	String upd ="UPDATE umproducto SET descUMProducto=?, umpDefault=?, IdUMConversion=?, coeficienteConv=?, umpHabilitado=?  WHERE IdProducto = ? and IdUnidadMedida = ?";
			stmt = (PreparedStatement) conn.prepareStatement(upd);
			for(UMProducto ump : umsProd){
				stmt.setString(1, ump.getDescripcion());
				stmt.setBoolean(2, ump.isUmpDefault());
				stmt.setInt(3, (ump.getUmConversion()!=null)?ump.getUmConversion().getIdUnidadMedida():0); // null
	    		stmt.setDouble(4, (ump.getUmConversion()!=null)?ump.getCoeficiente():0); // null
				stmt.setBoolean(5, ump.isUpmHabilitado());
				stmt.setString(6, ump.getProducto().getIdProducto());
				stmt.setInt(7, ump.getUnidadMedida().getIdUnidadMedida());
				stmt.addBatch();
			}
			stmt.executeBatch();
		}
    	catch (Exception e) {
			e.printStackTrace();
			return false;
		}
    	return true;
    }
	
	public UMProducto devolverUMProducto(String idProducto, Integer idUnidadMedida) throws Exception{
    	Connection conn = null;
    	UMProducto ump = null;
    	PreparedStatement stmt = null;
    	ProductoAdapter pa = new ProductoAdapter();
    	UnidadMedidaAdapter uma = new UnidadMedidaAdapter();
    	Producto p = null;
    	UnidadMedida um = null;
    	UnidadMedida umconversion = null;
    	
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT * FROM umproducto WHERE IdProducto =  ? and IdUnidadMedida = ? and umpHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setString(1, idProducto);
    		stmt.setInt(2, idUnidadMedida);
    		ResultSet result = stmt.executeQuery();
    		
    		if(result.next()){
    			String descripcion = result.getString("descUMProducto");
    			p = pa.devolverProducto(idProducto);
    			um = uma.devolverUnidadMedida(idUnidadMedida);
    			Integer idUMConversion = result.getInt("IdUMConversion");
    			umconversion = uma.devolverUnidadMedida(idUMConversion);
    			Boolean umpDefault = result.getBoolean("umpDefault");
    			Double coeficienteConv = result.getDouble("coeficienteConv");
    			ump = new UMProducto(p, um, umconversion, coeficienteConv, descripcion, umpDefault, true);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
		return ump;
    }
	
	public List<UMProducto> devolverTodos() throws Exception{
		Connection conn = null;
    	UMProducto ump = null;
    	PreparedStatement stmt = null;
    	ProductoAdapter pa = new ProductoAdapter();
    	UnidadMedidaAdapter uma = new UnidadMedidaAdapter();
    	Producto p = null;
    	UnidadMedida um = null;
    	UnidadMedida umconversion = null;
    	List<UMProducto> umps = new ArrayList<UMProducto>();
    	
		try {
			conn = (Connection) abrirConexion();
    		String sel ="SELECT * FROM umproducto WHERE umpHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){
    			String descripcion = result.getString("descUMProducto");
    			String idProducto = result.getString("IdProducto");
    			p = pa.devolverProducto(idProducto);
    			Integer idUnidadMedida = result.getInt("IdUnidadMedida");
    			um = uma.devolverUnidadMedida(idUnidadMedida);
    			Integer idUMConversion = result.getInt("IdUMConversion");
    			umconversion = uma.devolverUnidadMedida(idUMConversion);
    			Boolean umpDefault = result.getBoolean("umpDefault");
    			Double coeficienteConv = result.getDouble("coeficienteConv");
    			ump = new UMProducto(p, um, umconversion, coeficienteConv, descripcion, umpDefault, true);
    			umps.add(ump);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return umps;
    }
		
	public List<UMProducto> devolverUMProducto(Producto p) throws Exception{
		Connection conn = null;
    	UMProducto ump = null;
    	PreparedStatement stmt = null;
    	UnidadMedidaAdapter uma = new UnidadMedidaAdapter();
    	UnidadMedida um = null;
    	UnidadMedida umconversion = null;
    	List<UMProducto> umps = new ArrayList<UMProducto>();
    	
		try {
			conn = (Connection) abrirConexion();
    		String sel ="SELECT * FROM umproducto WHERE umpHabilitado = 1 and IdProducto = ?";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setString(1, p.getIdProducto());
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){
    			String descripcion = result.getString("descUMProducto");
    			Integer idUnidadMedida = result.getInt("IdUnidadMedida");
    			um = uma.devolverUnidadMedida(idUnidadMedida);
    			Integer idUMConversion = result.getInt("IdUMConversion");
    			umconversion = uma.devolverUnidadMedida(idUMConversion);
    			Boolean umpDefault = result.getBoolean("umpDefault");
    			Double coeficienteConv = result.getDouble("coeficienteConv");
    			ump = new UMProducto(p, um, umconversion, coeficienteConv, descripcion, umpDefault, true);
    			umps.add(ump);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return umps;
    }
	
}
